home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / strategy / xpuzzles.3 / xpuzzles / xpuzzles-5.3.1 / xdino / DinoU.c < prev    next >
C/C++ Source or Header  |  1996-04-02  |  7KB  |  265 lines

  1. /*
  2. # X-BASED DINOSAUR CUBE
  3. #
  4. #  DinoU.c
  5. #
  6. ###
  7. #
  8. #  Copyright (c) 1995 - 96    David Albert Bagley, bagleyd@hertz.njit.edu
  9. #
  10. #                   All Rights Reserved
  11. #
  12. #  Permission to use, copy, modify, and distribute this software and
  13. #  its documentation for any purpose and without fee is hereby granted,
  14. #  provided that the above copyright notice appear in all copies and
  15. #  that both that copyright notice and this permission notice appear in
  16. #  supporting documentation, and that the name of the author not be
  17. #  used in advertising or publicity pertaining to distribution of the
  18. #  software without specific, written prior permission.
  19. #
  20. #  This program is distributed in the hope that it will be "playable",
  21. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  23. #
  24. */
  25.  
  26. /* Undo algorithm */
  27.  
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <X11/IntrinsicP.h>
  31. #include <X11/Intrinsic.h>
  32. #include <X11/StringDefs.h>
  33. #include <X11/CoreP.h>
  34. #include "DinoP.h"
  35. #include "Dino2dP.h"
  36. #include "Dino3dP.h"
  37.  
  38. typedef struct _MoveRecord
  39. {
  40.   /* int face, position, direction, style, control; */
  41.   unsigned long int packed; /* This makes assumptions on the data. */
  42. } MoveRecord;
  43.  
  44. typedef struct _MoveStack
  45. {
  46.   MoveRecord move;
  47.   struct _MoveStack *previous, *next;
  48. } MoveStack;
  49.  
  50. static MoveStack *currMove, *lastMove, *firstMove;
  51. static int count;
  52. static DinoCornerLoc startLoc[MAXFACES][MAXORIENT];
  53.  
  54. static void InitStack();
  55. static void PushStack();
  56. static void PopStack();
  57. static int EmptyStack();
  58. static void FlushStack();
  59.  
  60. static void InitStack()
  61. {
  62.   if (!(lastMove = (MoveStack *) malloc(sizeof(MoveStack))))
  63.     XtError("Not enough memory, exiting.");
  64.   if (!(firstMove = (MoveStack *) malloc(sizeof(MoveStack))))
  65.     XtError("Not enough memory, exiting.");
  66.   firstMove->previous = lastMove->next = NULL;
  67.   firstMove->next = lastMove;
  68.   lastMove->previous = firstMove;
  69.   count = 0;
  70. }
  71.  
  72. static void PushStack(move)
  73.   MoveRecord move;
  74. {
  75.   if (!(currMove = (MoveStack *) malloc(sizeof(MoveStack))))
  76.     XtError("Not enough memory, exiting.");
  77.   lastMove->previous->next = currMove;
  78.   currMove->previous = lastMove->previous;
  79.   currMove->next = lastMove;
  80.   lastMove->previous = currMove;
  81.   currMove->move = move;
  82.   count++;
  83. }
  84.  
  85. static void PopStack(move)
  86.   MoveRecord *move;
  87. {
  88.   *move = lastMove->previous->move;
  89.   currMove = lastMove->previous;
  90.   lastMove->previous->previous->next = lastMove;
  91.   lastMove->previous = lastMove->previous->previous;
  92.   (void) free((void *) currMove);
  93.   count--;
  94. }
  95.  
  96. static int EmptyStack()
  97. {
  98.   return (lastMove->previous == firstMove);
  99. }
  100.  
  101. static void FlushStack()
  102. {
  103.   while (lastMove->previous != firstMove) {
  104.     currMove = lastMove->previous;
  105.     lastMove->previous->previous->next = lastMove;
  106.     lastMove->previous = lastMove->previous->previous;
  107.     (void) free((void *) currMove);
  108.   }
  109.   count = 0;
  110. }
  111.  
  112. /**********************************/
  113.  
  114. void InitMoves()
  115. {
  116.   InitStack();
  117. }
  118.  
  119. static void WriteMove(move, face, position, direction, style, control)
  120.   MoveRecord *move;
  121.   int face, position, direction, style, control;
  122. {
  123.   /* move->face = face; moves->position = position;
  124.   move->direction = direction; move->style = style;  move->control = control; */
  125.   move->packed = ((control & 0xF) << 16) + ((style & 0xF) << 12) +
  126.     ((direction & 0xF) << 8) + ((position & 0xF) << 4) + (face & 0xF);
  127. }
  128.  
  129. static void ReadMove(face, position, direction, style, control, move)
  130.   int *face, *position, *direction, *style, *control;
  131.   MoveRecord move;
  132. {
  133.   /* *face = move.face; *position = move.position; *direction = move.direction;
  134.   *style = move.style; *control = move.control; */
  135.   *face = move.packed & 0xF;
  136.   *position = (move.packed >> 4) & 0xF;
  137.   *direction = (move.packed >> 8) & 0xF;
  138.   *style = (move.packed >> 12) & 0xF;
  139.   *control = (move.packed >> 16) & 0xF;
  140. }
  141.  
  142. void PutMove(face, position, direction, style, control)
  143.   int face, position, direction, style, control;
  144. {
  145.   MoveRecord move;
  146.  
  147.   WriteMove(&move, face, position, direction, style, control);
  148.   PushStack(move);
  149. }
  150.  
  151. void GetMove(face, position, direction, style, control)
  152.   int *face, *position, *direction, *style, *control;
  153. {
  154.   MoveRecord move;
  155.  
  156.   PopStack(&move);
  157.   ReadMove(face, position, direction, style, control, move);
  158. }
  159.  
  160. int MadeMoves()
  161. {
  162.   return !EmptyStack();
  163. }
  164.  
  165. void FlushMoves(w)
  166.   DinoWidget w;
  167. {
  168.   int face, position;
  169.  
  170.   FlushStack();
  171.   for (face = 0; face < MAXFACES; face++)
  172.     for (position = 0; position < MAXORIENT; position++) {
  173.       startLoc[face][position].face = w->dino.cubeLoc[face][position].face;
  174.       startLoc[face][position].rotation =
  175.         w->dino.cubeLoc[face][position].rotation;
  176.     }
  177. }
  178.  
  179. int NumMoves()
  180. {
  181.   return count;
  182. }
  183.  
  184. void ScanMoves(fp, w, moves)
  185.   FILE *fp;
  186.   DinoWidget w;
  187.   int moves;
  188. {
  189.   int face, position, direction, style, control, k;
  190.   char c;
  191.  
  192.   for (k = 0; k < moves; k++) {
  193.     while ((c = getc(fp)) != EOF && c != SYMBOL);
  194.     (void) fscanf(fp, "%d %d %d %d %d", &face, &position, &direction,
  195.        &style, &control);
  196.     MoveDino(w, face, position, direction, style, control);
  197.   }
  198. }
  199.  
  200. void PrintMoves(fp)
  201.   FILE *fp;
  202. {
  203.   int face, position, direction, style, control, counter = 0;
  204.  
  205.   currMove = firstMove->next;
  206.   (void) fprintf(fp, "moves\tface\tpos\tdir\tstyle\tcon\n"); 
  207.   while (currMove != lastMove) {
  208.     ReadMove(&face, &position, &direction, &style, &control, currMove->move);
  209.     (void) fprintf(fp, "%d%c\t%d\t%d\t%d\t%d\t%d\n",
  210.       ++counter, SYMBOL, face, position, direction, style, control); 
  211.     currMove = currMove->next;
  212.   }
  213. }
  214.  
  215. void ScanStartPosition(fp, w)       
  216.   FILE *fp;
  217.   DinoWidget w;
  218. {
  219.   int face, position, num;
  220.   char c;
  221.  
  222.   while ((c = getc(fp)) != EOF && c != SYMBOL);
  223.   for (face = 0; face < MAXFACES; face++)
  224.     for (position = 0; position < MAXORIENT; position++) {
  225.       (void) fscanf(fp, "%d ", &num);
  226.       startLoc[face][position].face = num;
  227.       if (w->dino.orient) {
  228.         (void) fscanf(fp, "%d ", &num);
  229.         startLoc[face][position].rotation = num;
  230.       }
  231.     }
  232. }
  233.  
  234. void PrintStartPosition(fp, w)       
  235.   FILE *fp;
  236.   DinoWidget w;
  237. {
  238.   int face, position;
  239.  
  240.   (void) fprintf(fp, "\nstartingPosition%c\n", SYMBOL);
  241.   for (face = 0; face < MAXFACES; face++) {
  242.     for (position = 0; position < MAXORIENT; position++) {
  243.       (void) fprintf(fp, "%d ", startLoc[face][position].face);
  244.       if (w->dino.orient)
  245.         (void) fprintf(fp, "%d  ", startLoc[face][position].rotation);
  246.     }
  247.     (void) fprintf(fp, "\n");
  248.   }
  249. }
  250.  
  251. void SetStartPosition(w)       
  252.   DinoWidget w;
  253. {
  254.   int face, position;
  255.  
  256.   for (face = 0; face < MAXFACES; face++)
  257.     for (position = 0; position < MAXORIENT; position++) {
  258.       w->dino.cubeLoc[face][position].face = startLoc[face][position].face;
  259.       if (w->dino.orient)
  260.          w->dino.cubeLoc[face][position].rotation =
  261.            startLoc[face][position].rotation;
  262.     }
  263.   DrawAllPolyhedrons(w);
  264. }
  265.